﻿// ----------------------------------------------------------------------------------------
// Author:                    Joaquín López y Magally Vargas
// Company:                   Albalia Interactiva S.L
// Assembly version:          1.0.0.0
// Date:                      10/02/2009
// Time:                      12:11
// Solution Name:             FacturaeAdd-in
// Solution Filename:         FacturaeAdd-in.sln
// Solution FullFilename:     C:\Ribbon_Facturae\FacturaeAdd-in.sln
// Project Name:              FacturaeAdd-in
// Project Filename:          FacturaeAdd-in.csproj
// Project FullFilename:      C:\Ribbon_Facturae\FacturaeAdd-in\FacturaeAdd-in.csproj
// Project Item Name:         Language.cs
// Project Item Filename:     Language.cs
// Project Item FullFilename: C:\Ribbon_Facturae\FacturaeAdd-in\Language.cs
// Project Item Kind:         Código
// Purpose:                   Cargar el idioma de la aplicación
//Copyright © 2008 - 2009 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Threading;
using System.Xml.XPath;
using System.Globalization;

namespace FacturaeAdd_in
{
    /// <summary>
    /// Clase Singleton, la cual solo tendra una instancia durante la ejecución, en la que se cargan
    /// todos los textos utilizados por los controles del programa, en el idioma en el que esté Office, desde un
    /// archivo xml, siempre que exista el xml del idioma.
    /// </summary>
    class Language
    {

        #region "Fields"

        /// <summary>
        /// Única instancia de clase
        /// </summary>
        private static Language language = null;

        /// <summary>
        /// Documento que contendrá todos los textos.
        /// </summary>
        private static XmlDocument docLanguage = null;

        #endregion

        #region "Constructors"

        /// <summary>
        /// Único constructor de la clase.
        /// Privado, para que solo pueda ser accesible dentro de la clase.
        /// De esta manera nos aseguramos una única instancia
        /// </summary>
        private Language()
        {
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método estático que obtiene la única instancia de la clase si existe y sino se la crea
        /// por primera vez.
        /// </summary>
        /// <returns>La instacia de la clase</returns>
        public static Language getInstance()
        {
            if (language == null) //Verificamos si no ha sido creado
            {
                language = new Language();
                LoadLanguageFile();
            }
            return language; //Regresamos la instancia unica del objeto
        }

        /// <summary>
        /// Método que recibe por parámetor el nombre del control, busca esa etiqueta
        /// en el xml y devuelve un string con el texto asociado a esa etiqueta.
        /// </summary>
        /// <param name="label">Nombre de la etiqueta</param>
        /// <returns>Texto asociado a la etiqueta</returns>
        public string getLabels(string label) 
        {
            XPathNavigator navigator = docLanguage.CreateNavigator();
            XPathNavigator node;
            node = navigator.SelectSingleNode(String.Concat("//",label));
            if (node == null)
            {
                return label;
            }
            return node.Value;
        }

        #endregion

        #region "Private Methods"

        /// <summary>
        /// Método que comprueba el idioma de Office y carga el archivo de labels en el
        /// idioma correspondiente.
        /// </summary>
        private static void LoadLanguageFile() 
        {
            try
            {
               
                docLanguage = new XmlDocument();
                CultureInfo cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                String language = cInfo.Name;
                if (Globals.ThisAddIn.EnvironmentVariable == "")
                {
                    Globals.ThisAddIn.EnvironmentVariable = System.Environment.GetEnvironmentVariable("APPDATA");
                }
                docLanguage.Load(string.Concat(Globals.ThisAddIn.EnvironmentVariable + Paths.LanguagesPath,language,".xml"));
            }
            catch (Exception)
            {
                try
                {
                    docLanguage.Load(string.Concat(Globals.ThisAddIn.EnvironmentVariable + Paths.LanguagesPath,"es-ES.xml"));
                    ControlMessages msg = ControlMessages.getInstance();
                    System.Windows.Forms.MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionRibbon), System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        #endregion
    }
}
